#ifndef _COMMON_H_
#define _COMMON_H
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#include <sys/socket.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netinet/in.h>
// #include <mysql/mysql.h>  //mysql头文件
#include <sys/ioctl.h>
#include <net/if.h>
#include <sys/wait.h>
#include <unistd.h>

#include "cson.h"
#include "cJSON.h"
#define CLIENT_MAX 50
#define BUF_SIZE 1024
/**
 * 客户端结构体
 */
typedef struct Client
{
    int clientFd;
    int clientType;
} Client;
/**
 * 定义客户端数组
 */

// static Client clients[CLIENT_MAX] = {0};

/**
 * 定义判断重量结构体
*/
typedef struct checkData
{
    int id;
    int l_food;
    int r_food;
    int l_water;
    int r_water;
    int temperature;
    int humidity;
}CheckData;

/* 总结构体 */
typedef struct JsonStruct
{
    int oders;    // 下面表格详细规定命令
    int id;       // id
    int l_food;   // 小碗粮
    int r_food;   // 大罐粮
    int l_water;  // 小碗水
    int r_water;  // 大桶水
    int happy;    // 健康状态
    int temperature;
    int humidity;
    char *c_date; // 当前时间
    int entrust;  // 托管状态
} JsonStruct;

/**
 * @brief 主要命令
 */
enum TYPE_CLIENT
{
    ON = 1000,
    ADD_WATER = 2000,
    ADD_FOOD = 3000
};

/**
 * @brief 错误
 */
enum TYPE_CLIENT_OK
{
    WATER_ERROR = 2001,
    FOOD_ERROR = 3001
};
#endif

/**
 * @brief 客户端类型
 */
enum CLIENT_TYPE
{
    QT = 1,
    NOMOD = 3,
    STM32 = 4,
    
};
/**
 * 插入语句的定义
 */
#define INSERT_SQL "INSERT INTO animal_log(l_food,r_food,l_water,r_water,temperature,humidity,c_date) VALUE(%d,%d,%d,%d,%d,%d,NOW());"

#define SELECT_WEEK_DATA "SELECT oders,id,l_food,r_food,l_water,r_water,happy,temperature,humidity,c_date,entrust \
                          FROM animal_log                                                    \
                          WHERE DATE_SUB( CURDATE(), INTERVAL 7 DAY ) <= date( c_date );"
#define SELECT_NEW_DATA "SELECT ai.id, ai.temperature, ai.humidity                          \
                         FROM animal_log AS ai WHERE 1 = 1 ORDER BY ai.c_date DESC  LIMIT 1;"

#define UPDATE_H_T "UPDATE animal_log  SET temperature = %d,humidity = %d  WHERE id = %d;"
/**
 * @brief 封装初始化以及链接mysql
 * @param conn_ptr MYSQL指针
 * @param host 主机地址
 * @param user 用户名
 * @param pwd 密码
 * @param db 哪个数据库
 */
int myMysql_init(MYSQL *conn_ptr,
                 const char *host,
                 const char *user,
                 const char *pwd,
                 const char *db);

/**
 * @brief 关闭数据库
 * @param conn_ptr MYSQL指针
 */
int myMysql_close(MYSQL *conn_ptr);

/**
 * @brief 查询数据库
 * @param conn_ptr MYSQL 指针
 * @param res_Json 用于带出json
 */
int myMysql_select(MYSQL *conn_ptr, char **res_Json, JsonStruct *__data);

/**
 * @brief 插入animal_log表数据
 * @param conn_ptr MYSQL指针
 */
int myMysql_execute(MYSQL *conn_ptr,char *sql);



/**
    @brief 接收数据并处理函数实现
    @param __fd 监听文件描述符
    @param sql_ptr MYSQL指针
*/
int stm32_qt_recv(int __fd, MYSQL *sql_ptr);

/**
 * @brief 判断是qt客户端还是stm32客户端
 * @param __fd 客户端文件描述符
 * @return 1为qt，2为stm32
 */
int isStm32OrQtClient(int __fd);

/**
 * @brief 解析json 判断是哪个客户端指令
 * @param __jsonStr json数据
 * @param __fd 文件描述符
 * @param sql_ptr MYSQL指针
 */
void oper_qt_stm32(const char *__jsonStr, int __fd, MYSQL *sql_ptr);

/**
 * @brief stm32发送添食物指令
 * @param __fd 文件描述符
 * @return 0为出错，非零为正确
 */
int oper_stm32_food(int __fd);

/**
 * @brief stm32发送添食物指令
 * @param __fd 文件描述符
 * @return 0为出错，非零为正确
 */
int oper_stm32_water(int __fd);

/**
 * @brief 判断stm32是否登录
 * @return  未登录为 -1 登录成功为对应的文件描述符
 */
int isStm32Login();

/**
 * @brief 判断该fd是stm32还是QT
 * @return 1为QT 2为stm32
 */
int stm32OrQt(int __fd);

/**
 * @brief 截取字符串
 * @param str 截取的字符串
 * @param begin 在字符串中的截取的起始下标
 * @param len 截取的长度
*/
int subStm32Str(char *str, int begin, int len);

/**
 * @brief 更新温湿度
 * @param sql_ptr mysql指针
*/
int updateTandH(MYSQL *sql_ptr);